package com.lane.core.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 日期工具类，提供日期转换与加减的方法
 * @author 黄连忠
 */
public final class DateUtils {

	/**
	 * 执行型别转换:字符串表示的日期--->>日期型日期
	 * <li>1 格式为 yyyy-MM-dd
	 * <li>2 格式为 yyyy-MM-dd HH:mm:ss
	 * <li>3 格式为 yyyy/MM/dd HH:mm:ss
	 * <li>4 格式为 yy-MM-dd HH:mm:ss
	 * <li>5 格式为 yyyy年MM月dd日 HH时mm分ss秒
	 * <li>6 格式为 dd/MM/yyyy
	 * <li>7 格式为 yyyy年MM月dd日 HH时mm分
	 * <li>8 格式为 HH:mm:ss
	 * <li>9 格式为 yyyy-MM-ddHH:mm
	 * <li>默认格式为 yy年MM月dd日 HH时mm分ss秒
	 */
	public static Date stringToDate(final int style, String strDate) {
		SimpleDateFormat format = null;
		if (null == strDate || "".equals(strDate) || "null".equals(strDate)) {
			return null;
		} else {
			switch (style) {
			case 1:
				format = new SimpleDateFormat("yyyy-MM-dd");
				break;
			case 2:
				format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				break;
			case 3:
				format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
				break;
			case 4:
				format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
				break;
			case 5:
				format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
				break;
			case 6:
				format = new SimpleDateFormat("dd/MM/yyyy");
				break;
			case 7:
				format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
				break;
			case 8:
				format = new SimpleDateFormat("HH:mm:ss");
				break;
			case 9:
				format = new SimpleDateFormat("yyyy-MM-ddHH:mm");
				break;
			default:
				format = new SimpleDateFormat("yy年MM月dd日 HH时mm分ss秒");
				break;
			}
			try {
				return format.parse(strDate);
			} catch (ParseException e) {
				return null;
			}
		}
	}

	/**
	 * 执行型别转换:日期型日期--->>字符串表示的日期
	 * <li>1 格式为 yyyy-MM-dd
	 * <li>2 格式为 yyyy-MM-dd HH:mm:ss
	 * <li>3 格式为 yyyy/MM/dd HH:mm:ss
	 * <li>4 格式为 yy-MM-dd HH:mm:ss
	 * <li>5 格式为 yyyy年MM月dd日 HH时mm分ss秒
	 * <li>6 格式为 yyyy年MM月dd日
	 * <li>7 格式为 yy-MM-dd
	 * <li>8 格式为 HH:mm:ss
	 * <li>9 格式为 yyyy年MM月dd日 HH时mm分
	 * <li>10 格式为 yyyyMMdd HH:mm
	 * <li>11 格式为 HH:mm
	 * <li>默认格式为 yy年MM月dd日 HH时mm分ss秒
	 */
	public static String dateToString(final int style, Date date) {

		SimpleDateFormat format = null;

		if (null == date || "null".equals(date) || "".equals(date)) {

			return "";
		} else {

			switch (style) {
			case 1:
				format = new SimpleDateFormat("yyyy-MM-dd");
				break;
			case 2:
				format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				break;
			case 3:
				format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
				break;
			case 4:
				format = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
				break;
			case 5:
				format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
				break;
			case 6:
				format = new SimpleDateFormat("yyyy年MM月dd日");
				break;
			case 7:
				format = new SimpleDateFormat("yy-MM-dd");
				break;
			case 8:
				format = new SimpleDateFormat("HH:mm:ss");
				break;
			case 9:
				format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
				break;
			case 10:
				format = new SimpleDateFormat("yyyyMMdd HH:mm");
				break;
			case 11:
				format = new SimpleDateFormat("HH:mm");
				break;
			default:
				format = new SimpleDateFormat("yy年MM月dd日 HH时mm分ss秒");
				break;
			}
			try {
				return format.format(date);
			} catch (NumberFormatException e) {
				return "";
			}
		}
	}

	/**
	 * 执行型别转换:字符串表示的日期--->>日期型日期
	 */
	public static Date stringToDate(final String format, String strDate) {

		SimpleDateFormat dateFormat = null;

		if (null == strDate || "".equals(strDate) || "null".equals(strDate)) {

			return null;
		} else {

			dateFormat = new SimpleDateFormat(format);
			try {
				return dateFormat.parse(strDate);
			} catch (ParseException e) {
				return null;
			}
		}
	}

	/**
	 * 执行型别转换:日期型日期--->>字符串表示的日期
	 */
	public static String dateToString(final String format, Date date) {

		SimpleDateFormat dateFormat = null;

		if (null == date || "".equals(date) || "null".equals(date)) {

			return "";
		} else {

			dateFormat = new SimpleDateFormat(format);
			try {
				return dateFormat.format(date);
			} catch (NumberFormatException nfe) {
				return "";
			}
		}
	}

	/**
	 * 获取当前日期的long值对应的字符串
	 */
	public synchronized static String getTimeStamp() {
		Date d = new Date();
		return String.valueOf(d.getTime());
	}

	/**
	 * 获取当前年份
	 */
	public static final int getCurrentYear() {

		return new GregorianCalendar().get(GregorianCalendar.YEAR);
	}

	public static String getCurrentDay() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		String strDate = formatter.format(new Date());
		return strDate.substring(4, 8);
	}

	public static String getCurrentWeek() {
		int week = new GregorianCalendar().get(GregorianCalendar.DAY_OF_WEEK);
		if (week == 1) {
			return "日";
		} else if (week == 2) {
			return "一";
		} else if (week == 3) {
			return "二";
		} else if (week == 4) {
			return "三";
		} else if (week == 5) {
			return "四";
		} else if (week == 6) {
			return "五";
		} else {
			return "六";
		}
	}

	public static String getWeek(Date date) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		int week = calendar.get(GregorianCalendar.DAY_OF_WEEK);
		if (week == 1) {
			return "星期日";
		} else if (week == 2) {
			return "星期一";
		} else if (week == 3) {
			return "星期二";
		} else if (week == 4) {
			return "星期三";
		} else if (week == 5) {
			return "星期四";
		} else if (week == 6) {
			return "星期五";
		} else {
			return "星期六";
		}
	}

	/**
	 * 得到指定时间在指定天数之后的时间(传入负整数表示之前)
	 */
	public static Date getDateAfter(Date date, int afterDay) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, afterDay);
		return calendar.getTime();
	}

	/**
	 * 得到指定时间在指定小时数之后的时间(传入负整数表示之前)
	 */
	public static Date getDateAfterHour(Date date, int afterHour) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.HOUR, afterHour);
		return calendar.getTime();
	}

	/**
	 * 得到指定时间在指定分钟数之后的时间(传入负整数表示之前)
	 */
	public static Date getDateAfterMinute(Date date, int afterMinute) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.MINUTE, afterMinute);
		return calendar.getTime();
	}

	/**
	 * 得到指定时间在指定秒数之后的时间(传入负整数表示之前)
	 */
	public static Date getDateAfterSecond(Date date, int afterSecond) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.SECOND, afterSecond);
		return calendar.getTime();
	}

	/**
	 * 获得一个时间(Date对象)在当天的起始时刻的时间(Date对象)
	 */
	public static Date getDayStart(Date date) {

		String dateStr = dateToString("yyyy-MM-dd", date);
		date = stringToDate("yyyy-MM-dd", dateStr);
		return date;
	}

	/**
	 * 判断两个时间(Date对象)精确到天数以后是否相等
	 */
	public static boolean dateEquals(Date date1, Date date2) {
		String d1 = dateToString("yyyy-MM-dd", date1);
		String d2 = dateToString("yyyy-MM-dd", date2);
		if (d1.equalsIgnoreCase(d2)) {
			return true;
		} else {
			return false;
		}
	}
}
